package com.dszq.wemedia.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dszq.common.constants.ChannelConstants;
import com.dszq.model.channel.dtos.ChannelDTO;
import com.dszq.model.common.dtos.PageResponseResult;
import com.dszq.model.common.dtos.ResponseResult;
import com.dszq.model.common.enums.AppHttpCodeEnum;
import com.dszq.model.wemedia.pojos.WmChannel;
import com.dszq.model.wemedia.pojos.WmNews;
import com.dszq.wemedia.mapper.WmChannelMapper;
import com.dszq.wemedia.service.WmChannelService;
import com.dszq.wemedia.service.WmNewsService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * [一句话描述该类的功能]
 *
 * @author : [Lenovo]
 * @version : [v1.0]
 * @createTime : [2024/4/18 15:14]
 */
@Service
@Transactional
@Slf4j
public class WmChannelServiceImpl extends ServiceImpl<WmChannelMapper, WmChannel> implements WmChannelService {
    /**
     * 查找所有数据的方法。
     *
     * @return ResponseResult 返回操作的结果，其中包含查询到的所有数据。
     */
    @Override
    public ResponseResult findAll() {
        return ResponseResult.okResult(list());
    }

    /**
     * 查询所有频道信息
     *
     * @return ResponseResult 返回频道信息的查询结果，封装了状态码和数据
     */
    @Override
    public List<WmChannel> findAllChannels() {
        return list();
    }

    /**
     * 通过POST请求保存频道信息。
     *
     * @param wmChannel 频道信息对象，包含要保存的所有频道属性。
     * @return 返回操作结果，包括操作是否成功、错误信息等。
     */
    @Override
    public ResponseResult insert(WmChannel wmChannel) {
        if (wmChannel == null) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        WmChannel channel = getOne(Wrappers.<WmChannel>lambdaQuery().eq(WmChannel::getName, wmChannel.getName()));
        if (channel != null) {
            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_EXIST, "频道已存在");
        }
        wmChannel.setCreatedTime(new Date());
        save(wmChannel);
        return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
    }

    /**
     * 根据频道名称和分页信息，查询频道列表。
     *
     * @param channelDTO 频道数据传输对象，包含频道名称和分页信息。
     * @return 返回频道列表的响应结果。
     */
    @Override
    public ResponseResult listByNameAndPage(ChannelDTO channelDTO) {
        // 检查传入的频道DTO是否为null
        if (channelDTO == null) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        // 验证频道DTO参数的合法性
        channelDTO.checkParam();
        // 创建分页对象
        IPage page = new Page(channelDTO.getPage(), channelDTO.getSize());
        // 构建查询条件
        LambdaQueryWrapper<WmChannel> wmChannelLambdaQueryWrapper = new LambdaQueryWrapper<>();
        // 如果频道名称不为空，添加名称的模糊查询条件
        if (StringUtils.isNotBlank(channelDTO.getName())) {
            wmChannelLambdaQueryWrapper.like(WmChannel::getName, channelDTO.getName());
        }
        // 执行分页查询
        page = page(page, wmChannelLambdaQueryWrapper);
        // 构建响应结果，包含分页信息和查询数据
        ResponseResult responseResult = new PageResponseResult(channelDTO.getPage(), channelDTO.getSize(), (int) page.getTotal());
        responseResult.setData(page.getRecords());
        return responseResult;
    }
    @Autowired
    private WmNewsService wmNewsService;
    /**
     * 更新频道信息。
     *  - 点击编辑后可以修改频道名称等信息
     *  - 但是，如果该频道已被其他新闻文章引用，则不能禁用该频道
     * @param wmChannel 接收前端传来的频道信息对象，包含频道的详细数据，例如频道ID、频道名称等。
     * @return 返回操作结果，如果操作成功，则返回成功的响应结果；如果操作失败，例如传入的频道信息为null或频道下存在已发布的文章，则返回失败的响应结果。
     */
    @Override
    public ResponseResult updateChannel(WmChannel wmChannel) {
        // 检查传入的频道信息对象是否为null
        if (wmChannel==null)
        {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        
        // 查询该频道下已发布的新闻数量
        int count = wmNewsService.count(Wrappers.<WmNews>lambdaQuery().eq(WmNews::getChannelId, wmChannel.getId()).eq(WmNews::getStatus, WmNews.Status.PUBLISHED));
        
        // 如果频道下存在已发布的新闻，则不能修改该频道
        if (count>0){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID,"频道下有文章已发布，无法修改");
        }
        
        // 更新频道信息
        updateById(wmChannel);
        
        // 返回操作成功的响应结果
        return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
    }

    /**
     * 通过频道ID删除记录
     * 只有禁用的频道才能删除
     *
     * @param channelId 频道ID，路径变量
     * @return 返回操作结果，包括成功与否、错误码等信息
     */
    @Override
    public ResponseResult deleteById(Integer channelId) {
        if (channelId==null)
        {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        WmChannel wmChannel = getById(channelId);
        if (wmChannel==null)
        {
            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
        }
        if (wmChannel.getStatus().equals(ChannelConstants.CLOSE))
        {
            return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
        }else {
            return ResponseResult.errorResult(AppHttpCodeEnum.NEED_ADMIND,"启用频道不能删除");
        }
    }
}

